package com.xyre.client.business.index.view;

import android.app.ProgressDialog;
import android.os.Bundle;
import android.os.Handler;
import android.support.annotation.Nullable;
import android.support.design.widget.TextInputLayout;
import android.support.v4.app.Fragment;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.Toast;

import com.xyre.client.R;
import com.xyre.client.business.index.bean.UserInfo;
import com.xyre.client.business.index.bean.VerifyCodeRequest;
import com.xyre.client.business.index.bean.RegistRequest;
import com.xyre.client.business.index.presenter.GuidesPresenter;

/**
 * ==========================================
 * <p/>
 * 版    权 ： 北京爱接力科技有限公司
 * <p/>
 * 作    者 ： iwen
 * <p/>
 * 版    本 ： 1.0
 * <p/>
 * 创建日期 ： on 2016/3/3  15:06
 * <p/>
 * 描    述 ：
 * 新手引导界面中的手机注册界面
 * <p/>
 * <p/>
 * <p/>
 * 修订历史 ：
 * <p/>
 * ==========================================
 */
public class PhoneRegistFragment extends Fragment implements View.OnClickListener {

    // 根activity对象
    private IGuidesVIew rootActivity;
    // 手机注册页面的跟视图布局文件
    private View rootView;
    // 手机号码
    private TextInputLayout input_phone;
    // 短信验证码
    private TextInputLayout input_verifyCode;
    // 获取验证码按钮
    private Button btn_getVerifyCode;
    // 手机注册登录按钮
    private Button btn_regist;
    // 加载等待窗体
    private ProgressDialog progressDialog;

    /**
     * 服务器返回数据参数
     */
    // 服务器返回的验证码
    private String vericyCode;

    /**
     * 输入控制逻辑参数
     */
    // 手机号输入是否正确
    private boolean phoneIsOk = false;
    // 验证码输入是否正确
    private boolean verifyCodeIsOk = false;
    // 手机号输入错误提示文字
    private static final String PHONEERRORINFO = "手机号输入错误，请重新输入!";
    // 验证码输入错误提示文字
    private static final String VERIFYCODEERRORINFO = "验证码错误!";

    /**
     * 计时器控制参数
     */
    // 获取验证码的计时器
    private Handler timeHandle;
    // 计时器内容
    private Runnable timeRunnable;
    // 计时器时间上限
    private int timeOut = 60;
    // 计时时间
    private int time = timeOut;
    // 计时器时间间隔
    private int timeInterval = 1000;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        rootActivity = (IGuidesVIew) getActivity();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        rootView = inflater.inflate(R.layout.phone_regist, container, false);
        return rootView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        // 初始化UI控件
        initView();

    }

    // 初始化UI控件
    private void initView() {

        input_phone = (TextInputLayout) rootView.findViewById(R.id.phoneRegist_edit_phone);
        input_verifyCode = (TextInputLayout) rootView.findViewById(R.id.phoneRegist_edit_verifycode);

        btn_getVerifyCode = (Button) rootView.findViewById(R.id.phoneRegist_btn_getverifycode);
        btn_regist = (Button) rootView.findViewById(R.id.phoneRegist_btn_regist);
        btn_getVerifyCode.setOnClickListener(this);
        btn_regist.setOnClickListener(this);

        // 给电话号码输入框添加动态监听事件,输入11个字母才可以
        if (input_phone.getEditText() != null) {
            input_phone.getEditText().addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    // 输入开始前清空error显示信息
                    input_phone.setErrorEnabled(false);
                    phoneIsOk = false;
                }

                @Override
                public void onTextChanged(CharSequence phone, int start, int before, int count) {

                    int length = phone.length();
                    // 是11个数字才可以显示按钮，可以点，能显示，多了或少了，不能点，不显示
                    if (length == 11) {
                        btn_getVerifyCode.setEnabled(true);
                        btn_getVerifyCode.setVisibility(View.VISIBLE);
                        phoneIsOk = true;
                    } else {
                        btn_getVerifyCode.setEnabled(false);
                        btn_getVerifyCode.setVisibility(View.GONE);
                        phoneIsOk = false;
                    }
                }

                @Override
                public void afterTextChanged(Editable s) {
                }
            });
        }

        // 给验证码输入框设置监听事件，和发送的验证码不一样，提示输入错误
        if (input_verifyCode.getEditText() != null) {
            input_verifyCode.getEditText().addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    // 输入开始前清空error显示信息
                    input_verifyCode.setErrorEnabled(false);
                    verifyCodeIsOk = false;
                }

                @Override
                public void onTextChanged(CharSequence phone, int start, int before, int count) {
                }

                @Override
                public void afterTextChanged(Editable s) {

                    String verifyCode = input_verifyCode.getEditText().getText().toString().trim();
                    // 验证码和收到的一致，提示用户
                    if (vericyCode != null && verifyCode != null && verifyCode.equals(vericyCode)) {
                        // 提示用户验证码信息
                        input_verifyCode.setErrorEnabled(true);
                        input_verifyCode.setError("验证码正确");
                        verifyCodeIsOk = true;
                    } else {
                        input_verifyCode.setErrorEnabled(false);
                        verifyCodeIsOk = false;
                    }
                }
            });
        }

    }

    /**
     * 获取输入的手机号码
     *
     * @return 手机号码
     */
    private String getInputPhoneNo() {

        if (input_phone == null) {
            initView();
        }
        return input_phone.getEditText().getText().toString().trim();
    }


    /**
     * 获取输入的短息验证码，用于提示用户输入验证码是否正确，并提交给服务器进行进一步验证我
     *
     * @return 短信验证码
     */
    private String getInputVerifyCode() {

        return input_verifyCode.getEditText().getText().toString().trim();
    }


    /**
     * 显示获取短信验证码失败的状态
     * 1. 关闭获取验证码等待状态
     * 2. toast失败信息
     * 3. 重置获取短信验证码按钮的文字信息和状态
     *
     * @param msg 失败信息
     */
    public void showStateGetVerifuCodeError(String msg) {

        closeloading(1);
        // 关闭handle计时器
        closeTimeHandle();
        // 修改按钮文字
        btn_getVerifyCode.setText("点击从新获取验证码");
        Toast.makeText(getActivity(), "获取验证码失败" + msg, Toast.LENGTH_SHORT).show();

    }

    /**
     * 显示获取短信验证码成功的状态
     * 1. 关闭获取验证码等待状态
     * 2. 记录缓存短息验证码
     * 3. 重置获取短信验证码按钮的文字信息和状态
     *
     * @param verifyCode
     */
    public void showStateGetVerifuCodeSuccess(String verifyCode) {

        closeloading(1);
        // 关闭handle计时器
        closeTimeHandle();
        // 同步验证码数据
        this.vericyCode = verifyCode;
        // 修改按钮文字
        btn_getVerifyCode.setText("验证码已获取");
    }

    /**
     * 显示手机注册失败的状态
     * 1. 提示手机注册失败
     * 2. 关闭手机注册等待状态
     *
     * @param msg 错误信息
     */
    public void showStatePhoneRegistError(String msg) {

        Toast.makeText(getActivity(), "注册失败: " + msg, Toast.LENGTH_SHORT).show();
        closeloading(2);
    }

    /**
     * 显示手机注册成功的状态
     * 1. 提示手机注册成功
     * 2. 关闭手机注册等待状态
     * 3. 同步用户数据
     *
     * @param userInfo
     */
    public void showStatePhoneRegistSuccess(UserInfo userInfo) {

        Toast.makeText(getActivity(), "手机注册成功", Toast.LENGTH_SHORT).show();
        closeloading(2);
    }


    /**
     * 显示加载状态
     * 1：获取验证吗
     * 2: 手机注册登录
     *
     * @param title 标题信息
     * @param type  加载类型
     */
    public void showloading(String title, int type) {

        if (type == 1) {
            // 获取验证码等待,把按钮置为不可用
            btn_getVerifyCode.setEnabled(false);
            return;
        }

        if (type == 2) {
            // 手机注册登录等待，把按钮置为不可用，显示等待窗体
            getProgressDialog(title).show();
            btn_regist.setEnabled(false);
            return;
        }
    }


    public void closeloading(int type) {

        if (type == 1) {
            // 获取验证码等待,把按钮置为可用
            btn_getVerifyCode.setEnabled(true);
            return;
        }

        if (type == 2) {
            // 手机注册登录等待，把按钮置为可用，关闭等待窗体
//            getProgressDialog("正在登录，请稍等...").dismiss();
            if (progressDialog != null && progressDialog.isShowing()) {
                progressDialog.dismiss();
            }
            btn_regist.setEnabled(true);
            return;
        }
    }

    /**
     * 开始计时器
     */
    public void startTimeHandle() {

        time = timeOut;
        // 实现计时器对象和计时器执行内容对象
        if (timeHandle == null) {
            timeHandle = new Handler();
        }
        if (timeRunnable == null) {
            timeRunnable = new Runnable() {
                @Override
                public void run() {

                    btn_getVerifyCode.setText("剩余" + time + "s");
                    time--;
                    // 到时间关闭计时器
                    if (time == 0) {
                        closeTimeHandle();
                        return;
                    }
                    // 没到时间，延迟每一秒执行一次
                    timeHandle.postDelayed(this, timeInterval);
                }
            };
        }
        // 启动计时器
        timeHandle.post(timeRunnable);
    }

    /**
     * 关闭计时器
     */
    public void closeTimeHandle() {

        btn_getVerifyCode.setText("获取验证码");
        btn_getVerifyCode.setEnabled(true);
        if (timeHandle != null && timeRunnable != null) {
            timeHandle.removeCallbacks(timeRunnable);
        }
    }


    @Override

    public void onClick(View v) {

        int id = v.getId();
        switch (id) {

            // 获取短信验证码点击事件
            case R.id.phoneRegist_btn_getverifycode:

                // 开启计时器
                startTimeHandle();
                // 启动网络连接
                rootActivity.getPresenter().getVerifyCode(new VerifyCodeRequest(getInputPhoneNo()));
                break;

            // 手机注册并登录
            case R.id.phoneRegist_btn_regist:

                // 先验证相关参数输入是否正确
                if (!isCanRegist()) {
                    return;
                }
                // 再启动注册登录手机号网络操作
                rootActivity.getPresenter().phoneRegist(new RegistRequest("2", getInputPhoneNo(), getInputVerifyCode(), "", "", ""));
                break;

        }

    }

    /**
     * 验证输入是否正确，不正确不可以进行网络操作
     *
     * @return
     */
    private boolean isCanRegist() {

        String inputPhoneNo = getInputPhoneNo();

        // 提示错误信息
        if (TextUtils.isEmpty(inputPhoneNo)) {
            input_phone.setErrorEnabled(true);
            input_phone.setError("手机号不能为空");
            return false;
        }

        if (inputPhoneNo.length() < 11) {
            input_phone.setErrorEnabled(true);
            input_phone.setError("请正确填写手机号");
            return false;
        }

        String inputVerifyCode = getInputVerifyCode();

        if (TextUtils.isEmpty(inputVerifyCode)) {
            input_verifyCode.setErrorEnabled(true);
            input_verifyCode.setError("验证码不能为空");
            return false;
        }

        if (!inputVerifyCode.equals(vericyCode)) {
            input_verifyCode.setErrorEnabled(true);
            input_verifyCode.setError("验证码不正确");
            return false;
        }

        return true;
    }


    /**
     * 获取网络等待显示窗体
     *
     * @param title
     * @return
     */
    private ProgressDialog getProgressDialog(String title) {

        if (progressDialog == null) {
            progressDialog = new ProgressDialog(getActivity());
            progressDialog.setTitle(title);
        }
        return progressDialog;
    }

    @Override
    public void onDestroy() {
        GuidesPresenter presenter = (GuidesPresenter) rootActivity.getPresenter();
        presenter.phoneRegistFragment = null;
        presenter = null;
        super.onDestroy();
        if (progressDialog != null && progressDialog.isShowing()) {
            progressDialog.dismiss();
        }
        progressDialog = null;
        rootView = null;
        rootActivity = null;
    }


}
